嗨大家今天過得好嗎?繼昨天試圖在 MVP 架構中使用 Paging 的機制,發現 Paging 的使用不是那麼好上手,據說今年新推出的 Paging3 有改良舊版的痛點變得更平易近人?今天就來比較新舊版的 Paging library 有什麼差異!
還記得 Paging 的三位一體是什麼嗎?分別是 PagedList ( Model )、DataSource ( Model ) 和 PagedListAdapter ( View ),到了 Paging3 把原來的 PagedList 變成具有 streaming 特性的 PagingData,原來的 DataSource 變成 PagingSource,雖然 DataSource 和 PagingSource 的功能差不多,但需要 implement 的 method 也從 3 個簡化成一個,View 的部分也從原來的 PagedListAdapter 變為 PagingDataAdapter。以下簡單列出幾點差異:
Streaming type 再來多一點:
原先 Paging library 只有支援 LiveData 和 RxJava,但在 Paging3 還新增對 coroutines 和 Flow 還有 RxJava Single 的支援!
支援 Error handle:
還記得昨天的 psedo code 漏了一部份的 error handle 嗎?原先的機制並沒有包含 error handle 還要另外 implement,但在 Paging3 就新增了 refresh 和 retry 的 error handle。
表示狀態的 Loading state:
透過 Loading
、NotLoading
和 Error
三個狀態可以讓 PagedListAdapter 正確顯示當前 View 的狀態。
layout 組成和資料分離:
View 長得很複雜,例如每 20 筆資料中間要插入一筆廣告,PagedListAdapter 僅能處理一種 data type 不夠用嗎?在 Paging3 的 PagingData 因為有 streaming 的特性可以在中間插入原先資料來源沒有的資料,或是加上 header 和 footer,layout 的邏輯可以與資料本身分離。
看了上面這些 Paging3 的改變也心動想要升級了嗎?但如果原先就有導入 Paging 的機制,其實要更改的範圍也很多,好在 Paging3 和舊版有支援相容,要升級的話可以漸進式升級不用一次到位,例如先把 DataSource 換成 PagingSource 或是 PagedList 和 PagedListAdapter 換成 PagingData 和調整 PagedListAdapter,對於 code base 比較大的專案就不會讓升級升得提心吊膽(吧)。
Paging 針對換頁的需求提供了整套的機制,PagedListAdapter 在載入見底時可以觸發 DataSource / PagingSource 換頁,不再只能透過 OnScrollListener 計算顯示數目再被動載入資料。因為列表的載入需求不需要存進 DB,所以這次只有實作 Network DataSource,但 Paging 還有支援 Network 搭配 Database 的 DataSource,可以在本地 Database 先 cache 住資料,當資料見底時再去呼叫 Network 的 data,雖然本地 Database 有多種架構,但跟 Paging 相容的是同為 Jetpack component 的 Room,如果是其他 Database 的架構還要另外處理相容性問題。
結論 Android 官方終於願意正視換頁的問題發表 Paging 的 library,而且還有持續維護,雖然最新的 Paging3 還在 alpha 階段,但距離正式 release 的階段應該不遠了!大家 Paging library 用起來!